package memory.memoryCopy;


/**
 * @Author wsyjiamian@163.com
 * @Description java中使用等号赋值的内存拷贝过程
 * @Date 2020/8/16 12:47
 */
public class EqualSignCopy {
    public static void main(String[] args) {

        //基本数据类型通过等号赋值，肯定会生成一个新的地址，互不干扰
        EqualSignCopy qc = new EqualSignCopy();

        int a = 10;
        int b = a; //把 a 赋值给 b
        b = 20;
        System.out.println("a : " + a);
        System.out.println("b : " + b);

        //对象数据类型
        User u = new User("zs", 10);
        User u1 = u;
        u.name = "ls";
        u.age = 20;

        //u修改后，u1的值也被修改；通过打印地址也可以看出等号赋值操作后，两者指向同一个堆内存地址
        System.out.println(u + " " + u1);
        System.out.println(u1.name);

        //当u1赋值为null后，u和u1打印的地址已经不相等了
        //因为在赋值的同时，Java底层应该是对引用变量（栈内存中）做了一个拷贝，拷贝模型如下，两者指向同一个 new User
        //栈内存        堆内存
        //  u  ------
        //  |           new User
        //  u1 ------
        //因此从栈中的内存可以看出u和u1已经是不一样的内容了，当u1 = null，不会对u产生任何影响
        u1 = null;
        System.out.println(u + " " + u1);
    }

    static class User {
        String name;
        int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

       /* @Override
       public String toString() {
            return "[name: "+name+", age: "+age+", idCard: "+idCard.toString()+"]";
        }*/
    }

}
